
package kr.makjang.lib.util;

/**
 * @date 2011.12.9
 * @package kr.makjang.lib.util
 * @content 한글을 초성, 중성, 종성으로 분리하는 Class
 */

public class MakHangulDivision {
    private final char[] mChoSung = {
            0x3131, 0x3132, 0x3134, 0x3137, 0x3138, // ㄱ ㄲ ㄴ ㄷ ㄸ
            0x3139, 0x3141, 0x3142, 0x3143, 0x3145, // ㄹ ㅁ ㅂ ㅃ ㅅ
            0x3146, 0x3147, 0x3148, 0x3149, 0x314a, // ㅆ ㅇ ㅈ ㅉ ㅊ
            0x314b, 0x314c, 0x314d, 0x314e          // ㅋ ㅌ ㅍ ㅎ
    };

    private final char[] mJwungSung = {
            0x314f, 0x3150, 0x3151, 0x3152, 0x3153, // ㅏ ㅐ ㅑ ㅒ ㅓ
            0x3154, 0x3155, 0x3156, 0x3157, 0x3158, // ㅔ ㅕ ㅖ ㅗ ㅘ
            0x3159, 0x315a, 0x315b, 0x315c, 0x315d, // ㅙ ㅚ ㅛ ㅜ ㅝ
            0x315e, 0x315f, 0x3160, 0x3161, 0x3162, // ㅞ ㅟ ㅠ ㅡ ㅢ
            0x3163                                  // ㅣ
    };

    private final char[] mJongSung = {
            0, 0x3131, 0x3132, 0x3133, 0x3134,      // ㄱ ㄲ ㄳ ㄴ ㄵ
            0x3135, 0x3136, 0x3137, 0x3139, 0x313a, // ㄶ ㄷ ㄹ ㄺ ㄻ
            0x313b, 0x313c, 0x313d, 0x313e, 0x313f, // ㄼ ㄽ ㄾ ㄿ ㅀ
            0x3140, 0x3141, 0x3142, 0x3144, 0x3145, // ㅁ ㅂ ㅄ ㅅ ㅆ
            0x3146, 0x3147, 0x3148, 0x314a, 0x314b, // ㅇ ㅈ ㅊ ㅋ ㅌ
            0x314c, 0x314d, 0x314e                  // ㅍ ㅎ
    };

    public MakHangulDivision() {

    }

    /**
     * 초성, 중성, 종성으로 분리하여 반환하는 Method
     * 
     * @param hangul 한글 스트링
     * @return 각각의 한글 글자를 '초성/중성/종성'의 형식으로 반환 (예 : 막장 - ㅁㅏㄴㅈㅏㅇ)
     */
    public String division(String hangul) {
        // 자소 버퍼: 초성/중성/종성
        int a, b, c;
        String result = "";

        for (int i = 0; i < hangul.length(); i++) {
            char ch = hangul.charAt(i);

            // "AC00:가" ~ "D7A3:힣" 에 속한 글자면 분해
            if (ch >= 0xAC00 && ch <= 0xD7A3) {
                c = ch - 0xAC00;
                a = c / (21 * 28);
                c = c % (21 * 28);
                b = c / 28;
                c = c % 28;

                result = result + mChoSung[a] + mJwungSung[b];
                if (c != 0)
                    // c가 0이 아니면, 즉 받침이 있으면
                    result = result + mJongSung[c];
            } else {
                result = result + ch;
            }
        }
        return result;
    }

    /**
     * 초성 만 분리하여 반환하는 Method
     * 
     * @param hangul 한글 스트링
     * @return 각각의 한글 글자를 초성만 추출하여 반환(예 : 막장 - ㅁㅈ)
     */
    public String chosungDivision(String hangul) {
        // 자소 버퍼: 초성/종성
        int a, c;
        String result = "";

        for (int i = 0; i < hangul.length(); i++) {
            char ch = hangul.charAt(i);

            // "AC00:가" ~ "D7A3:힣" 에 속한 글자면 분해
            if (ch >= 0xAC00 && ch <= 0xD7A3) {
                c = ch - 0xAC00;
                a = c / (21 * 28);
                c = c % (21 * 28);

                result = result + mChoSung[a];
            } else {
                result = result + ch;
            }
        }
        return result;
    }
} // end of class MakHangulDivision
